﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//
//int main()
//{
//	int a = -5;
//	char c = 'A';
//	return 0;
//}

//
//int main()
//{
//	char a = 5;
//	char b = 120;
//	char c = a + b;
//	printf("%d", c);
//	return 0;
//}


//数据存放内存中其实存放的是补码


//左移操作符
//int main()
//{
//	int a = 3;
//	int b = -3;
//	b <<= 1;
//	a <<= 1;
//	printf("%d\n", a);
//	printf("%d", b);
//
//	return 0;
//}
//3
//00000000000000000000000000000011
//00000000000000000000000000000110
//-3
//10000000000000000000000000000011
//11111111111111111111111111111100
//11111111111111111111111111111101	 补码
//11111111111111111111111111111010
//取反加一
//10000000000000000000000000000101
//10000000000000000000000000000110
//-6

//右移运算符
//int main()
//{
//	int a = 3;
//	int b = -3;
//	b >>= 1;
//	a >>= 1;
//	printf("%d\n", a);
//	printf("%d", b);
//
//	return 0;
//}
//3
//00000000000000000000000000000011
//00000000000000000000000000000001
//-3
//10000000000000000000000000000011
//11111111111111111111111111111100
//11111111111111111111111111111101	 补码
//11111111111111111111111111111110
//取反加一
//10000000000000000000000000000001
//10000000000000000000000000000010
//-2


//位操作符


//实现两个数得交换
//1.
//int main()
//{
//	int a = 2;
//	int b = 3;
//	int temp;
//	temp = a;
//	a = b;
//	b = temp;
//	printf("a=%d,b=%d", a, b);
//	return 0;
//}
//2.
//int main()
//{
//	int a = 3;
//	int b = 2;
//	a = a + b;
//	b = a - b;
//	a = a - b;
//	printf("a=%d,b=%d", a, b);
//	return 0;
//}


//3
//int main()
//{
//	int a = 3;
//	int b = 2;
//	a = a ^ b;
//	b = a ^ b;//b=a^b^b
//	a = a ^ b;//a=a^a^b
//	printf("a=%d,b=%d", a, b);
//	return 0;
//}


//编写代码实现：求⼀个整数存储在内存中的⼆进制中1的个数
//int main()
//{
//	int num = 0;
//	scanf("%d", &num);
//	int count = 0;
//	while (num)
//	{
//		if (num % 2 == 1)
//		{
//			count++;
//		}
//		num = num / 2;
//	}
//	printf("%d", count);
//	return 0;
//}
//负数不行



//
//int main()
//{
//	int num = 0;
//	scanf("%d", &num);
//	int count = 0;
//	for (int i = 0; i < 32; i++)
//	{
//		if ((num >> i) & 1 == 1)
//		{
//			count++;
//		}
//	}
//	printf("%d", count);
//	return 0;
//}

//可以负数
//-1
//1000 0000 0000 0000 0000 0000 0000 0001
//1111 1111 1111 1111 1111 1111 1111 1110
//1111 1111 1111 1111 1111 1111 1111 1111 补码
//32位1；



//int main()
//{
//	int sum = 0;
//	scanf("%d", &sum);
//	int count = 0;
//	while (sum)
//	{
//		sum = sum & (sum - 1);
//		count++;
//	}
//	printf("%d", count);
//	return 0;
//}

//逗号表达式


//写一个程序，判断一个数是不是2的n次方？
//2^n这个数的二进制只有一个1


//int main()
//{
//	int num = 0;
//	scanf("%d", &num);
//	if ((num & (num - 1)) == 0)//注意操作符的执行顺序
//	{
//		printf("yes\n");
//	}
//	else
//		printf("no");
//	return 0;
//}

//将2进制的第5位改成0
//int main()
//{
//	int a = 29;
//	//0000 0000 0000 0000 0000 0000 0001 1101//原值
//	//0000 0000 0000 0000 0000 0000 0000 1101//目标值
//	//0000 0000 0000 0000 0000 0000 0000 0001//1
//	//0000 0000 0000 0000 0000 0000 0001 0000//移位
//	//1111 1111 1111 1111 1111 1111 1110 1111//取反
//	a = a & ~(1 << 4);
//	printf("%d", a);
//	return 0;
//}